Binary search in SORTED array (only)ΒΆ
Performance: O(log2(N))
def bin_search(A, N):
# borders
l_idx = 0
r_idx = len(A) - 1
iter = 0
while l_idx <= r_idx:
mid_idx = (l_idx + r_idx) // 2
mid_val = A[mid_idx]
if mid_val == N:
return mid_idx, iter
elif mid_val > N:
r_idx = mid_idx - 1
else:
l_idx = mid_idx + 1
iter += 1
return -1, iter
# test
# Input: list, N:
# < >
# [--------------- * ----------------]
# l_idx m_idx * r_idx
#
# Method:
# while l_idx <= r_idx
# m_idx = (l_idx + r_idx) // 2
# m_val = list[m_idx]
while True:
in_str = input("Enter number from list {} or e[xit]: ".format(lst)).strip()
if in_str != "e":
number = int(in_str)
idx, iter = bin_search(lst, number)
if idx >= 0:
print("Index for item {} is {} [{} iter]".format(number, idx, iter))
else:
print("Not found")
else:
break
Output:
Enter number from list [1, 2, 3, 6, 7, 9, 21, 33] or e[xit]: 21
Index for item 21 is 6 [2 iter]
Enter number from list [1, 2, 3, 6, 7, 9, 21, 33] or e[xit]: 22
Not found
Enter number from list [1, 2, 3, 6, 7, 9, 21, 33] or e[xit]: 1
Index for item 1 is 0 [2 iter]
Enter number from list [1, 2, 3, 6, 7, 9, 21, 33] or e[xit]: 2
Index for item 2 is 1 [1 iter]
Enter number from list [1, 2, 3, 6, 7, 9, 21, 33] or e[xit]: e